<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>函数-函数属性</title>
</head>
<body>
  
</body>
<script>
  // name
  // Function构造器创建的函数，它的名字是“anonymous”
  var func = new Function("a", "b", "return a+b")
  console.log(func.name)

  // 匿名函数，它的名字是变量名；如果改用命名函数表达式创建，它的名字是等号右侧的函数名称
  var expression1 = function() {}
  console.log(expression1.name)     // expression1

  var expression2 = function named() {}
  console.log(expression2.name)     // named

  // 当用bind()方法绑定一个函数时，它的名字是“bound xxx”
  function age() {}
  console.log(age.bind(this).name)

  // 访问器属性包含写入和读取方法，它们的名称会分别加上“set”和“get”前缀
  var obj = {
    get age() {},
    set age(value) {}
  }

  var descriptor = Object.getOwnPropertyDescriptor(obj, "age")
  console.log(descriptor.get.name)    // get age
  console.log(descriptor.set.age)     // undefined  ???

  // Symbol命名的方法，它的名字就是它的描述
  var sym = Symbol("age")
  var obj = {
    [sym]:function() {}
  }

  console.log(obj[sym].name)

  // length
  // length的值会受剩余参数和默认参数的影响
  console.log((function rest(name, ...args){}).length)
  console.log((function rest(name, age = 28){}).length)
  console.log((function rest(name, age = 28, school){}).length)

</script>
</html>